package cn.demoncat.util.redis.entity;

import cn.demoncat.util.lang.LocalDateUtil;
import cn.demoncat.util.lang.constant.DateConstant;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * Redis Sequence Key 序列 常量
 *
 * @author 延晓磊
 * @since 2021年02月13日
 */
@Data
public class RedisSeq {

    // 默认序列前缀名
    public static final String SEQ_NAME = "SEQ:";

    // 缓存键/键前缀，建议以:结尾（实际key为key+currPrefix，如果prefix为动态则会有多条序列key）
    private String key;
    // 序列的前缀，为空时忽略（实际前缀为getCurrPrefix）
    private String prefix;
    // 序列的日期格式化，为空时不拼接日期
    private DateTimeFormatter dateFormat;
    // 序列格式化：null 不格式化；'0000' 不足4位补0
    private String format;
    // 序列的缓存秒数，默认1天（用于自动清理缓存，不作参与业务）
    private Integer exp = DateConstant.SECONDS_OF_DAY;

    /**
     * 构建
     *
     * @param key           缓存键/键前缀，建议以:结尾
     * @param prefix        序列的前缀，为空时忽略
     * @param dateFormat    序列的日期格式化，为空时不拼接日期
     * @param format        序列格式化：null 不格式化；'0000' 不足4位补0
     * @return
     *
     * @author 延晓磊
     * @since 2022年04月01日
     */
    public static RedisSeq build(String key, String prefix, DateTimeFormatter dateFormat, String format){
        RedisSeq seq = new RedisSeq();
        if (key.startsWith(SEQ_NAME)) {
            seq.setKey(key);
        }else{
            seq.setKey(SEQ_NAME + key);
        }
        seq.setPrefix(StringUtils.trimToEmpty(prefix));
        seq.setDateFormat(dateFormat);
        seq.setFormat(format);
        return seq;
    }

    /**
     * 构建
     *
     * @param key           缓存键/键前缀，建议以:结尾
     * @param dateFormat    序列的日期格式化，为空时不拼接日期
     * @param format        序列格式化：null 不格式化；'0000' 不足4位补0
     * @return
     *
     * @author 延晓磊
     * @since 2022年04月01日
     */
    public static RedisSeq build(String key, DateTimeFormatter dateFormat, String format){
        return build(key, null, dateFormat, format);
    }

    /**
     * 构建
     *
     * @param prefix    动态前缀
     * @return
     *
     * @author 延晓磊
     * @since 2022年04月01日
     */
    public RedisSeq build(String prefix){
        return RedisSeq.build(this.getKey(), this.getPrefix() + prefix, this.getDateFormat(), this.getFormat());
    }

    /**
     * 序列的缓存秒数，默认1天（用于自动清理缓存，不作参与业务）
     *
     * @param exp
     * @return
     */
    public RedisSeq setExp(Integer exp) {
        this.exp = exp;
        return this;
    }

    /**
     * 获取序列
     *
     * @param lastId    最后一条数据的ID
     * @return
     *
     * @author 延晓磊
     * @since 2022年04月01日
     */
    public Long getSeq(String lastId){
       return Long.parseLong(lastId.substring(lastId.length() - this.getFormat().length())) + 1;
    }

    /**
     * 获取当前前缀
     *
     * @return  通过 prefix + dataFormat 根据当前时间生成
     *
     * @author 延晓磊
     * @since 2022年04月01日
     */
    public String getCurrPrefix(){
        if (this.getDateFormat() == null) {
            return this.getPrefix();
        }else{
            return this.getPrefix() + LocalDateUtil.format(LocalDateTime.now(), this.getDateFormat());
        }
    }

}


